import base64
import uuid
from datetime import datetime

from tornado import web, ioloop


class indexHandler(web.RequestHandler):
    def get(self):
        self.write('123')
        self.clear_all_cookies()
        # print(base64.b64encode(uuid.uuid4().bytes))
        # print(base64.b64encode(uuid.uuid4().bytes))
        # print(base64.b64encode(uuid.uuid4().bytes))


class setcookieHandler(web.RequestHandler):
    def get(self):
        self.write('123')
        # set_cookie 有三个参数，如果只传前两个的话，就默认这个cookie是会话级的。关闭或者重新开启一个新的页面的时候，这个cookie就没了
        self.set_cookie('cookiename', 'vvvvv')
        # set_cookie 加上第三个参数。 就是为这个cookie设置过期时间， 这个过期时间 是时间戳类型，表示到什么时间过期
        self.set_cookie('token', '998', expires=datetime.now().timestamp() + 10)


class delcookieHandler(web.RequestHandler):
    def get(self):
        self.write('123')
        # 清除单个 cookie
        self.clear_cookie('cookiename')
        # 清除当前 服务器ip地址下的所有 cookie
        self.clear_all_cookies()
        # 清除单个 cookie的另一种方式,  通过 set_cookie 将对应cookie的过期时间设置为 过去的时间，也能清除cookie
        self.set_cookie('cookiename',None,expires=datetime.now().timestamp() - 3600)



class getcookieHandler(web.RequestHandler):
    def get(self):
        # 从客户端接受 cookie，第二参数表示 取不到对应 cookie值时，返回的默认值。不设置的话，如果取的时候没有对应的值 tornado会报错。
        cookieVal = self.get_cookie('cookiename', None)
        print('cookie--', cookieVal)


# 加密 cookie的使用
class secretecookieHandler(web.RequestHandler):
    def get(self):
        # 用加密的方式 为客户端设置 cookie
        self.set_secure_cookie('secure_cookie', '我是我')
        # 以安全的方式 获取 cookie。 此时获取到的cookie还是 bytes 的样子，还需要 进行解码
        securecookie = self.get_secure_cookie('secure_cookie', None)
        print('securecookie', securecookie)
        # 进行 解码 securecookie.decode()
        print('securecookie-decode', securecookie.decode())


def make_app(**kargs):
    return web.Application(**kargs)


params = {
    'handlers': [
        (r'/', indexHandler),
        (r'/setcookie', setcookieHandler),
        (r'/delcookie', delcookieHandler),
        (r'/getcookie', getcookieHandler),
        (r'/securecookie', secretecookieHandler)
    ],
    'debug': True,
    # 对cookie 添加密钥，进行传输加密
    # base64.b64encode(uuid.uuid4().bytes) 用于生成密钥， elCt7WrbR/OZ6KfYMWYggQ==。 密钥是唯一的，只创建一次即可
    'cookie_secret': 'elCt7WrbR/OZ6KfYMWYggQ=='
}
settings = {
    'port': 8088
}
if __name__ == '__main__':
    app = make_app(**params)
    app.listen(**settings)
    ioloop.IOLoop.current().start()
